package com.atguigu.test.dacahngmainshitidierji.collection;

import org.apache.commons.collections.map.HashedMap;

import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.CopyOnWriteArraySet;
import java.util.stream.Collectors;

/**
 * 2 * @Author: madonghui
 * 3 * @Date: 2020/11/9 13:33
 *        集合类不安全问题
 * 4
 */
public class CollectionNonSafeDemo {
    public static void main(String[] args) {

        Map<String,String> map = new HashedMap();
        for (int i = 0; i < 100 ; i++) {
            new Thread(()->{
                String s = UUID.randomUUID().toString();
                map.put(Thread.currentThread().getName(),s);
                System.out.println(map);
            },String.valueOf(i)).start();
        }
    }


    public static void hashSetTest(){
        //new ArrayList<>();底层做了什么工作：
        /**
         * 创建了一个 空的数组，并且数组容量为10
         */
        //出现了并发修改异常Set<Integer> integers = new HashSet<>();
        //Set<Integer> integers1 = new HashSet<>();//
        ////Set<Integer> integers = Collections.synchronizedSet(integers1);
        Set<Integer> integers = new CopyOnWriteArraySet<>();new HashSet<>();
        integers.add(1);
        integers.add(2);
        integers.add(3);
        integers.add(4);
        integers.add(5);
        integers.add(6);
        for (int i = 0; i < 30 ; i++) {
            int finalI = i;
            new Thread(()->{
                integers.add(finalI);
                System.out.println(integers);
            },String.valueOf(i)).start();
        }
    }
    public static void arrayListTest(){
        //new ArrayList<>();底层做了什么工作：
        /**
         * 创建了一个 空的数组，并且数组容量为10
         */
        List<Integer> integers = new ArrayList<>();new Vector<Integer>();
        integers.add(1);
        integers.add(2);
        integers.add(3);
        integers.add(4);
        integers.add(5);
        integers.add(6);
        for (int i = 0; i < 30 ; i++) {
            int finalI = i;
            new Thread(()->{
                integers.add(finalI);
                System.out.println(integers);
            },String.valueOf(i)).start();
        }
        /*
        故障现象：ConcurrentModificationException
        * 1.导致问题的原因
               并发争抢修改导致的，比如签名表，一个人正在写还没写完另一个人一下子抢走导致数据不一致异常
        * 2.解决方案
             <2.1 new Vector<Integer>(); 解决，底层修改方法添加了sync锁，安全性上升，并发性下降
             备注： new ArrayList<Integer>();牺牲安全性提高了并发性
             <2.2 Collections.synchronizedList(List)
             <2.3 new CopyOnWriteArrayList<> () 写时复制
        * 3.优化建议（下次需要闭坑）
        * */
        CopyOnWriteArrayList<Integer> copyOnWriteArrayListeArrayList = new CopyOnWriteArrayList<>();
    }
}
